
# check 检查功能区，在合并的时候去检查当前合并后的数据所存在的问题，返回info方便之后数据的核对
#需要重构----------------------------------------------------------------
import os
import csv
import pandas as pd
from function.fun_data_deal import stage_divide, group_by_prefix
import json
from collections import defaultdict
from difflib import SequenceMatcher

from other_function.info import subject

pd.set_option('display.max_columns', None)  # 显示所有列
pd.set_option('display.width', 1000)        # 设置显示宽度
pd.set_option('display.max_colwidth', 1000)  # 设置列内容的最大显示宽度






# 检查总函数，
def check(key,path):
    try:
        func = globals()[key + "_check"]
        df=pd.read_csv(path)
        info_check=func(df)
        return info_check
    except:
        print("没有该功能")



#输入deal后文件夹，返回文件夹中某test中有几类文件 例如 {'1034-1-1': 6, '1034-2-1': 6, '1034-4-1': 2}
def file_check(deal_path):
    infolist={}
    file_list = os.listdir(deal_path)

    for testlist in group_by_prefix(file_list):
        test=testlist[0][0:8]
        infolist[test]={}
        infolist[test].update({'file_type':len(testlist)})
        for data in testlist:
            key=data.split('-')[3][:-4]
            path=deal_path+'\\'+data

            info=check(key,path)
            infolist[test].update({key:info})
            print(key,path)
    print(infolist)

    return infolist




#检查乳酸与阶段和速度阶段是否能对齐
def la_speed_check():
    info={}



    return info

# ecg检查，预计输出info信息有：  非连续的断点列表、
def ecg_check(ecg_df):
    df=ecg_df
    '''

    :param df: deal 中的ecg
    :return: info
    '''



    # 设置info
    info = {}
    info['name']='ecg'

    hz=len(df['ecg_timestamp'])/(df['ecg_timestamp'].iloc[-1]-df['ecg_timestamp'].iloc[0])*1000000000

    print("该文件的总长度%s" % len(df['ecg_timestamp']))
    print("该文件的频率%s" % hz )
    df['ecg_timestamp'] = pd.to_numeric(df['ecg_timestamp'], errors='coerce')
    df['time_check'] = df['ecg_timestamp'].diff()
    df.iloc[:, 0] = df.iloc[:, 0].apply(lambda x: int(str(x)[:13]))  # 假设第一列是你希望处理的列，可以根据实际情况调整列的索引
    df['ecg_time'] = pd.to_datetime(df.iloc[:, 0], unit='ms', utc=True).dt.tz_convert('Asia/Shanghai')
    df['ecg_time'] = df['ecg_time'].dt.strftime('%Y-%m-%d %H:%M:%S.%f').str[:-3]
    print("开始时间%s,结束时间%s" % (df['ecg_time'].iloc[0], df['ecg_time'].iloc[-1]))
    # 输出超过8000的行
    exceed_rows = df[df['time_check'] > 10000000]
    print("文件连续性检查，有问题的地方：%s" % len(exceed_rows))
    info['inter']=exceed_rows['ecg_time']

    # 阶段分层信息，可用来检查
    stage_df = stage_divide(ecg_df)
    # 检查每个阶段的时间差,和血液的次数速度对齐






    return info




#rrdata 检查   连续性检查
def rrdata_check(df):
    info = {}
    info['name']='rrdata'
    print(df)


    return info




# ppg检查  ？
def ppg_check(df):
    info = {}
    info['name']='ppg'

    return info



#rri检查  ？
def rri_check(df):
    info = {}
    info['name']='rri'

    return info



# singwork 转df




#singlework 检查 ？
def singlework_check(singlework_df):
    '''

    :param df:
    :return:
    '''

    info={}
    info['name'] = 'singlework'
    info['length']=  len(singlework_df)


    return info



# singledetail检查  ？

def singledetail_check(singledetail_df):
    '''

    :param df:
    :return:
    '''
    info={}
    info['name'] = 'singledetail'


    print(singledetail_df)
    #检查连续性


    #




    return  info


# 检查ppg和singledetail是否完整包含整个work
def time_check(ppg_df,singledetail_df,singlework_df):
    info={}
    #提取ppg中开始和结束的时间戳，转换为时间
    print(ppg_df.loc[-1, :])
    print(singledetail_df.loc[:, :])
    print(singlework_df.loc[:, :])

    # 提取singledetail中开始和结束的时间戳转换为时间


    #提取rri中的开始和结束转为时间



    # 提取 singlework中的最开始的第一阶段的结束和最后一阶段的结尾时间




    # 做判断，得到 singleworkppg中的时间的差距 判断是否符合数据要求





    return info



# ecg阶段和乳酸阈值，对不上的检查,对齐返回0，未对齐返回1
def stage_check(ecg_df,test):
    info = {}
    stage_df = stage_divide(ecg_df)


    la = subject[subject['id_test'] == test].values[0][9:-1]

    la = [x for x in la if x]
    la.insert(1, '')
    if len(stage_df) - 2 == len(la):
        info[test]='0'
    else:
        info[test]='1'
    # print(subject)
    # print(la)
    # print(stage_df)
    # print(info)
    return info






















